// Symbol() Symbol函数

let x: symbol = Symbol()
let y: symbol = Symbol()
console.log(x === y) // false

// symbol 类型 包含了所有的Symbol值  无法表示一个具体的 Symbol 值

const var01: unique symbol = Symbol()
// let var02: unique symbol = Symbol() 报错

const a: unique symbol = Symbol()
const b: unique symbol = Symbol()

// console.log(a === b) 比较毫无意义
// 参考如下比较
const a2: 'Hello' = 'Hello'
const b2: 'World' = 'World'
// console.log(a2 === b2) 比较毫无意义

// 由于变量a和b是两个类型，就不能把一个赋值给另一个
const a3: unique symbol = Symbol()
// const b3: unique symbol = a // 报错  type a3 无法赋值给 typeof b3
const b3: typeof a3 = a3 // OK...

// 两个不同的值类型，但是它们的值其实是相等的。
const a4: unique symbol = Symbol.for('foo')
const b4: unique symbol = Symbol.for('foo')

const a5: unique symbol = Symbol()
const b5: symbol = a5
// const c5: unique symbol = b5  symbol !=> unique symbol

// unique symbol 类型的一个作用，就是用作属性名，
// 这可以保证不会跟其他属性名冲突。如果要把某一个特定的 Symbol 值当作属性名，
// 那么它的类型只能是 unique symbol，不能是 symbol

const x1: unique symbol = Symbol()
const y1: symbol = Symbol()

interface Foo {
  [x1]: string // 正确
  // [y1]: string // 报错
}

let x2 = Symbol()  // symbol
const x3 = Symbol() // unique symbol
const x4 = x2 // symbol
let x5 = x3 // symbol
